﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using Seesmic.Sdp.Extensibility;
using Seesmic.Sdp.Utils;
using PTiRouZ.Net.SilverLight.Api.HelloTipi;
using System.ComponentModel;
using System.Windows.Browser;

namespace Seesmic.HelloTipi
{
    /*
     *  @mafamille mon message
        @unepersonne#mafamille mon message
        @unepersonne mon message : ne fonctionnera que si vous n’avez qu’un site de famille en commun avec le destinataire
        Pour envoyer un message privé avec cette fonction, vous pouvez précéder le message du nom de la personne et de sa famille précéder de “d “.
        Les exemples suivants envoient un message privé à la personne “unepersonne” sur la famille “mafamille” :
        
        d unepersonne#mafamille mon message
        d unepersonne mon message : ne fonctionnera que si vous n’avez qu’un site de famille en commun avec le destinataire
     * */

    public class FamilyPostingProvider : IPostingProvider
    {
        private readonly HelloTipiSession _Session;
        private readonly String _Famille;

        public FamilyPostingProvider(HelloTipiSession session, String famille)
        {
            this._Session = session;
            this._Famille = famille;
        }

        public bool CanPost(PostContainer postContainer)
        {          
            //On verifie s'il n'y as pas déja la syntaxe
            
            int userpos;
            string user;
            
            if (postContainer.Text.StartsWith("d "))
                userpos = postContainer.Text.IndexOf(' ', 2);
            else if (postContainer.Text.StartsWith("@"))
                userpos = postContainer.Text.IndexOf(' ');
            else
                return !string.IsNullOrWhiteSpace(postContainer.Text);

            user = postContainer.Text.Substring(0, userpos);

            if (user.Contains("#"))
                return (HelloTipiPlugin.getFamilyNameOnly(user) == this._Famille);
            else
                return true;
        }

        public void PostAsync(PostContainer postContainer, object userState, AsyncCompletedCallback callback)
        {
            string text = postContainer.Text;
            //On ne met pas les Metada pour le moment
            /*if (postContainer.Metadata.Count > 0)
            {
                text = postContainer.Metadata[0].ToString() + text;
            }*/

            this._Session.api.UpdatePublicCompleted += delegate(object sender, UpdatePublicEventArgs e)
            {
                callback(this, new AsyncCompletedEventArgs(null, false, userState));
            };

            this._Session.api.UpdatePrivateCompleted += delegate(object sender, UpdatePrivateEventArgs e)
            {
                callback(this, new AsyncCompletedEventArgs(null, false, userState));
            };

            /*this._Session.api.dmNewCompleted += delegate(object sender, dmNewEventArgs e)
            {
                callback(this, new AsyncCompletedEventArgs(null, false, userState));
            };*/

            int userpos;            
            
            //On ajoute la famille (%23 = #)
            if (text.StartsWith("d "))
            {                
                userpos = text.IndexOf(' ', 2);
                if(!text.Substring(0, userpos).Contains("#"))
                    text = String.Format("{0}#{1}{2}", text.Substring(0, userpos), this._Famille, text.Substring(userpos));
                this._Session.api.UpdatePrivate(HttpUtility.UrlEncode(text));
            }
            else if (text.StartsWith("@"))
            {
                userpos = text.IndexOf(' ');
                if (!text.Substring(0, userpos).Contains("#"))
                    text = String.Format("{0}#{1} {2}>{3}", text.Substring(0, userpos), this._Famille, text.Substring(1, userpos-1), text.Substring(userpos));
                else
                    text = String.Format("{0} {1}> {2}", text.Substring(0, userpos), HelloTipiPlugin.getUserNameOnly(text.Substring(1, userpos)), text.Substring(userpos+1));
                this._Session.api.UpdatePublic(HttpUtility.UrlEncode(text));
            }
            else
                this._Session.api.UpdatePublic(String.Format("@{0} {1}", this._Famille, HttpUtility.UrlEncode(text)));

            //HelloTipiPlugin.LogInfo("Message envoyé : " + text);
            
            /*this._Session.Adapter.PostAsync(text, userState, delegate(object us, HelloTipiTimeLineItem timelineItem, Exception error)
            {
                this._Session.AddItems(new HelloTipiTimeLineItem[] { timelineItem }, AggregatedTimelines.Sent, new HelloTipiSessionOrigin(this._Session));
                callback(this, new AsyncCompletedEventArgs(error, false, us));
            });*/
        }

        public DataTemplate Icon
        {
            get
            {
                return HelloTipiPlugin.SmallIcon;
            }
        }

        public string Id
        {
            get
            {
                return String.Format("{0}_{1}", this._Famille, this._Session.Account.Id);
            }
        }

        public string Text
        {
            get
            {
                return this._Famille; /*(this._Session.Account as HelloTipiAccount).ScreenName;*/
            }
        }
    }
}
